// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (c) Microsoft Corporation. All rights reserved

#include "Private.h"
#include "TableDictionaryEngine.h"
#include "DictionarySearch.h"

//+---------------------------------------------------------------------------
//
// CollectWord
//
//----------------------------------------------------------------------------

VOID CTableDictionaryEngine::CollectWord(_In_ CStringRange* pKeyCode, _Inout_ CSampleImeArray<CStringRange>* pWordStrings) {
	CDictionaryResult* pdret = nullptr;
	CDictionarySearch dshSearch(_locale, _pDictionaryFile, pKeyCode);

	while (dshSearch.FindPhrase(&pdret)) {
		for (UINT index = 0; index < pdret->_FindPhraseList.Count(); index++) {
			CStringRange* pPhrase = nullptr;
			pPhrase = pWordStrings->Append();
			if (pPhrase) {
				*pPhrase = *pdret->_FindPhraseList.GetAt(index);
			}
		}

		delete pdret;
		pdret = nullptr;
	}
}

VOID CTableDictionaryEngine::CollectWord(_In_ CStringRange* pKeyCode, _Inout_ CSampleImeArray<CCandidateListItem>* pItemList) {
	CDictionaryResult* pdret = nullptr;
	CDictionarySearch dshSearch(_locale, _pDictionaryFile, pKeyCode);

	while (dshSearch.FindPhrase(&pdret)) {
		for (UINT iIndex = 0; iIndex < pdret->_FindPhraseList.Count(); iIndex++) {
			CCandidateListItem* pLI = nullptr;
			pLI = pItemList->Append();
			if (pLI) {
				pLI->_ItemString.Set(*pdret->_FindPhraseList.GetAt(iIndex));
				pLI->_FindKeyCode.Set(pdret->_FindKeyCode.Get(), pdret->_FindKeyCode.GetLength());
			}
		}

		delete pdret;
		pdret = nullptr;
	}
}

//+---------------------------------------------------------------------------
//
// CollectWordForWildcard
//
//----------------------------------------------------------------------------

VOID CTableDictionaryEngine::CollectWordForWildcard(_In_ CStringRange* pKeyCode, _Inout_ CSampleImeArray<CCandidateListItem>* pItemList) {
	CDictionaryResult* pdret = nullptr;
	CDictionarySearch dshSearch(_locale, _pDictionaryFile, pKeyCode);

	while (dshSearch.FindPhraseForWildcard(&pdret)) {
		for (UINT iIndex = 0; iIndex < pdret->_FindPhraseList.Count(); iIndex++) {
			CCandidateListItem* pLI = nullptr;
			pLI = pItemList->Append();
			if (pLI) {
				pLI->_ItemString.Set(*pdret->_FindPhraseList.GetAt(iIndex));
				pLI->_FindKeyCode.Set(pdret->_FindKeyCode.Get(), pdret->_FindKeyCode.GetLength());
			}
		}

		delete pdret;
		pdret = nullptr;
	}
}

//+---------------------------------------------------------------------------
//
// CollectWordFromConvertedStringForWildcard
//
//----------------------------------------------------------------------------

VOID CTableDictionaryEngine::CollectWordFromConvertedStringForWildcard(_In_ CStringRange* pString, _Inout_ CSampleImeArray<CCandidateListItem>* pItemList) {
	CDictionaryResult* pdret = nullptr;
	CDictionarySearch dshSearch(_locale, _pDictionaryFile, pString);

	while (dshSearch.FindConvertedStringForWildcard(&pdret)) // TAIL ALL CHAR MATCH
	{
		for (UINT index = 0; index < pdret->_FindPhraseList.Count(); index++) {
			CCandidateListItem* pLI = nullptr;
			pLI = pItemList->Append();
			if (pLI) {
				pLI->_ItemString.Set(*pdret->_FindPhraseList.GetAt(index));
				pLI->_FindKeyCode.Set(pdret->_FindKeyCode.Get(), pdret->_FindKeyCode.GetLength());
			}
		}

		delete pdret;
		pdret = nullptr;
	}
}

